package com.xyy.saas.payment.util;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Date;

/**
 * @author wangzeqi
 */
public class TimestampConverter {

    private static final Logger log = LoggerFactory.getLogger(TimestampConverter.class);

    /**
     * 容错处理
     */
    public static Date safeConvert(Long timestamp) {
        try {
            return convertTimestamp(timestamp);
        } catch (Exception e) {
            log.error("TimestampConverter 时间戳转换异常, timestamp:{}", timestamp, e);
            return null;
        }
    }

    /**
     * 智能转换时间戳（自动判断秒/毫秒）
     *
     * @param timestamp 时间戳（可能是秒或毫秒）
     * @return 转换后的日期对象
     */
    public static Date convertTimestamp(long timestamp) {
        long currentMillis = System.currentTimeMillis();

        // 判断时间戳的合理范围
        if (isMillisecondsTimestamp(timestamp, currentMillis)) {
            return new Date(timestamp);
        } else {
            return new Date(timestamp * 1000);
        }
    }

    /**
     * 判断是否为毫秒级时间戳
     */
    private static boolean isMillisecondsTimestamp(long timestamp, long currentMillis) {
        // 双阈值检测逻辑
        final long MILLIS_LOWER_BOUND = 1000000000000L; // 2001-09-09 01:46:40
        final long SECONDS_UPPER_BOUND = currentMillis / 1000;

        // 判断逻辑：
        // 1. 如果时间戳超过当前毫秒值，必定是毫秒级（未来时间）
        // 2. 时间戳在毫秒级合理区间（2001年之后）且大于秒级当前时间
        return timestamp > currentMillis ||
                (timestamp >= MILLIS_LOWER_BOUND && timestamp > SECONDS_UPPER_BOUND);
    }

    public static void main(String[] args) {
        // 测试用例
        testConversion(1672531200L);      // 秒级：2023-01-01 00:00:00
        testConversion(1672531200000L);   // 毫秒级：2023-01-01 00:00:00
        testConversion(4102444800L);      // 秒级：2100-01-01
        testConversion(1739435106L);
        testConversion(1739435106000L);
    }

    private static void testConversion(long timestamp) {
        try {
            System.out.println("输入：" + timestamp);
            System.out.println("转换结果：" + safeConvert(timestamp));
            System.out.println("----------------------");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}
